package com.ktjy.ktmall.service.impl;

import com.ktjy.ktmall.dao.CategoryItemDao;
import com.ktjy.ktmall.dao.GoodsItemDao;
import com.ktjy.ktmall.dao.impl.CategoryItemDaoImpl;
import com.ktjy.ktmall.dao.impl.GoodsItemDaoImpl;
import com.ktjy.ktmall.entity.CategoryItem;
import com.ktjy.ktmall.entity.GoodsItem;
import com.ktjy.ktmall.service.CategoryItemService;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author JieGe
 * @Create 2024-07-18 - 19:41
 * @Description
 */
public class CategoryItemServiceImpl implements CategoryItemService {
    CategoryItemDao dao = new CategoryItemDaoImpl();
    @Override
    public List<CategoryItem> getOneLevelCategory() {
        return dao.getOneLevelCategory();
    }

    // 创建商品DAO接口对象
    GoodsItemDao goodsItemDao = new GoodsItemDaoImpl();

    /**
     * 查询所有的一级商品分类列表下的二级商品分类列表，再查询出每个二级分类下的商品列表
     * @return 返回查询到的商品分类列表
     */
    @Override
    public List<CategoryItem> getCategoryAndGoods() {
        // 1、查询出所有的商品分类列表（包括一级和二级商品分类列表）
        List<CategoryItem> allCategoryList = dao.findAllCategoryList();
        // 2、从所有的商品分类列表中过滤中一级商品分类列表
        List<CategoryItem> oneLevelList = allCategoryList.stream().filter(c -> {
            // 过滤条件是category_level = 1，即商品分类的级别为1
            return c.getCategoryLevel() == 1;
        }).collect(Collectors.toList());
        // 3、调用map()方法遍历一级商品分类
        oneLevelList = oneLevelList.stream().map((oneLevel) -> {
            // 查询出每个一级商品分类下的二级商品分类列表
            oneLevel.setChildren(getChildrenCategory(oneLevel, allCategoryList));
            return oneLevel;
        }).collect(Collectors.toList());
        return oneLevelList;
    }

    /**
     * 查询出一级商品分类下的二级商品分类列表
     * @param oneLevel 一级商品分类对象
     * @param allCategoryList 所有的商品分类列表
     */
    private List<CategoryItem> getChildrenCategory(CategoryItem oneLevel, List<CategoryItem> allCategoryList) {
        // 从所有的商品列表中过滤出当前一级商品分类下的二级商品分类列表。
        List<CategoryItem> twoLvelList = allCategoryList.stream().filter((c) -> {
            // 过滤条件是：当前分类的父id == 当前一级分类的id
            return c.getParentId() == oneLevel.getId();
        }).map((two) -> { // 调用map方法遍历所有的二级商品分类
            // 根据二级商品分类id查询出此商品分类下的商品列表
            List<GoodsItem> list = goodsItemDao.getGoodsByCategoryId(two.getId());
            two.setGoods(list);
            return two;
        }).collect(Collectors.toList());
        return twoLvelList;
    }

}
